<?php
require_once(MODULESPATH . "core/d.object.class.php");
require_once(MODULESPATH . "accounts/dataaccess/d.accounts.inc.php");

/**
 * 账户系统数据层用户首选项类。
 */
class DPreference extends DObject implements IDPreference {    
    /*- IDPreference 接口实现 START -*/
    /*- IInjectEnable 接口实现 START -*/
    /**
     * 设置属性值。
     */
    public function __set($prop, $val){
        $this->$prop = $val;
    }
    /*- IInjectEnable 接口实现 END -*/
    
    /**
     * 设置用户的首先项。
     * @param Int $userId 系统用户ID。
     * @param String $key 首选项的键。
     * @param String $val 首选项的值。
     * @param String $type 用户首选项的类型。
     * @return 是否设置成功。
     */
    public function setPreference($userId, $key, $val, $type){
        $result = 0;
        $exist = $this->checkPreferenceExist($userId, $key, $type);
        if($exist){
            $result = $this->update($userId, $key, $val, $type);
        }else{
            $result = $this->insert($userId, $key, $val, $type);
        }
        return $result;
    }
    
    /**
     * 获取用户的首选项列表。
     * @param Int $userId 系统用户ID。
     * @param String $type 用户首选项的类型。
     * @return Array 首选项列表。
     */
    public function getPreferences($userId, $type){
        $result = array();
        $sql = "select preference_key, preference_value, user_preference_type from accounts_user_preferences where user_id = $userId and user_preference_type = '$type'";
        try{
            $rows = $this->dao->getData($sql);
            if($rows){
                foreach($rows as $row){
                    $result[$row["preference_key"]] = array(
                        "key" => $row["preference_key"],
                        "value" => $row["preference_value"],
                        "type" => $row["user_preference_type"]
                        );
                }
            }
        }catch(Exception $ex){
        }
        return  $result;
    }
    /*- IAdjustUserData 接口实现 START -*/
    /**
     * 更换数据的用户ID。
     * @param Int $oldId 用户旧ID。
     * @param Int $newId 用户新ID。
     * @return 是否操作成功。
     */
    public function replaceByUid($oldId, $newId){
        $result = 0;
        $sql = "update accounts_user_preferences set user_id = $newId WHERE  `user_id` =  $oldId;";
        try{
            $this->dao->runSql($sql);
            $result = 1;
        }catch(Exception $ex){
        }
        return  $result;
    }
    
    /**
     * 根据用户ID删除数据。
     * @param Int $uid 用户ID。
     * @return 是否操作成功。
     */
    public function deleteByUid($uid){
        $result = 0;
        $sql = "delete from accounts_user_preferences WHERE `user_id` =  '$uid';";
        try{
            $this->dao->runSql($sql);
            $result = 1;
        }catch(Exception $ex){
        }
        return  $result;
    }
    /*- IAdjustUserData 接口实现 END -*/
    /*- IDPreference 接口实现 END -*/
    
    /*- 私有方法 START -*/
    /**
     * 检查用户首先项是否存在。
     * @param Int $userId 系统用户ID。
     * @param String $key 首选项的键。
     * @param String $val 首选项的值。
     * @param String $type 用户首选项的类型。
     * @return 是否设置成功。
     */
    private function checkPreferenceExist($userId, $key, $type){
        $result = 0;
        $sql = "select max(user_preference_id) from accounts_user_preferences where user_id = $userId and  preference_key = '$key' and user_preference_type = '$type'";
        try{
            $o = $this->dao->getVar($sql);
            if($o){
                $result = ($o > 0) ? 1 : 0;
            }
        }catch(Exception $ex){
        }
        return  $result;
    }
    
    /**
     * 插入用户的首先项。
     * @param Int $userId 系统用户ID。
     * @param String $key 首选项的键。
     * @param String $val 首选项的值。
     * @param String $type 用户首选项的类型。
     * @return 是否插入成功。
     */
    private function insert($userId, $key, $val, $type){
        $result = 0;
        $sql = "insert into accounts_user_preferences (user_id, preference_key, preference_value, user_preference_type, update_time, create_time) values ($userId, '$key', '$val', '$type', " . time() . "," . time() . ");";
        try{
            $this->dao->runSql($sql);
            $result = 1;
        }catch(Exception $ex){
        }
        return  $result;
    }
    
    /**
     * 更新用户的首先项。
     * @param Int $userId 系统用户ID。
     * @param String $key 首选项的键。
     * @param String $val 首选项的值。
     * @param String $type 用户首选项的类型。
     * @return 是否更新成功。
     */
    private function update($userId, $key, $val, $type){
        $result = 0;
        $sql = "update accounts_user_preferences set preference_value = '$val', update_time = " . time() ." where user_id = $userId and  preference_key = '$key' and user_preference_type = '$type';";
        try{
            $this->dao->runSql($sql);
            $result = 1;
        }catch(Exception $ex){
        }
        return  $result;
    }
    /*- 私有方法 END -*/
}
?>
